namespace CSharpPro._1028;

using System;
using System.Collections.Generic;

public class UserServiceImp : UserService
{
        // 1. 初始化泛型集合：存储所有注册用户（List<User>为泛型集合，仅允许存入User类型）
        private readonly List<User> _userList = new List<User>();
        // 2. 控制台输入工具：用于接收用户输入的用户名、密码等信息
        private readonly ConsoleScanner _scanner = new ConsoleScanner();
        
        public bool Register(User user)
        {
            try
            {
                // 步骤1：校验用户名是否已存在（使用foreach循环迭代泛型集合）
                foreach (var existingUser in _userList)
                {
                    // 忽略大小写匹配（可选：根据需求决定是否区分大小写）
                    if (existingUser.Username.Equals(user.Username, StringComparison.OrdinalIgnoreCase))
                    {
                        Console.WriteLine($"❌ 注册失败！用户名【{user.Username}】已存在");
                        return false;
                    }
                }

                // 步骤2：用户名唯一，添加到泛型集合
                _userList.Add(user);
                Console.WriteLine($"✅ 注册成功！用户名【{user.Username}】，邮箱【{user.Email ?? "未填写"}】");
                return true;
            }
            catch (ArgumentException ex)
            {
                // 捕获User属性校验抛出的异常（如用户名空、密码长度不足）
                Console.WriteLine($"❌ 注册失败：{ex.Message}");
                return false;
            }
        }
        
        public User Login(string username, string password)
        {
            // 步骤1：参数合法性校验
            if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
            {
                Console.WriteLine("❌ 登录失败！用户名或密码不能为空");
                return null;
            }

            // 步骤2：foreach循环迭代泛型集合，匹配用户名和密码
            foreach (var user in _userList)
            {
                // 用户名忽略大小写，密码严格匹配（实际项目需加密存储，此处为演示）
                if (user.Username.Equals(username, StringComparison.OrdinalIgnoreCase) 
                    && user.Password.Equals(password))
                {
                    Console.WriteLine($"✅ 登录成功！欢迎您，{user.Username}！");
                    return user;
                }
            }

            // 遍历结束未匹配到用户
            Console.WriteLine("❌ 登录失败！用户名或密码错误");
            return null;
        }

        /// <summary>
        /// 实现流程控制：控制台菜单交互（循环直到用户选择退出）
        /// </summary>
        public void StartMenu()
        {
            while (true)
            {
                // 1. 打印菜单
                Console.WriteLine("\n==================== 用户登录注册系统 ====================");
                Console.WriteLine("1. 新用户注册");
                Console.WriteLine("2. 已有用户登录");
                Console.WriteLine("3. 退出系统");
                Console.Write("请选择操作（输入1-3）：");

                // 2. 接收用户选择（处理非法输入）
                if (!int.TryParse(_scanner.ReadLine(), out int choice) || choice < 1 || choice > 3)
                {
                    Console.WriteLine("❌ 输入错误！请输入1-3之间的数字");
                    continue;
                }

                // 3. 根据选择执行对应逻辑
                switch (choice)
                {
                    case 1:
                        // 执行注册：获取用户输入，创建User对象，调用Register方法
                        Console.WriteLine("\n----- 新用户注册 -----");
                        Console.Write("请输入用户名：");
                        string regUsername = _scanner.ReadLine();

                        Console.Write("请输入密码（至少6位）：");
                        string regPassword = _scanner.ReadLine();

                        Console.Write("请输入邮箱（可选，格式需含@）：");
                        string regEmail = _scanner.ReadLine();

                        // 创建User对象（属性校验会自动触发）
                        var newUser = new User();
                        try
                        {
                            newUser.Username = regUsername;
                            newUser.Password = regPassword;
                            newUser.Email = regEmail;
                            // 调用注册方法
                            Register(newUser);
                        }
                        catch (ArgumentException ex)
                        {
                            Console.WriteLine($"❌ 注册失败：{ex.Message}");
                        }
                        break;

                    case 2:
                        // 执行登录：获取用户输入，调用Login方法
                        Console.WriteLine("\n----- 已有用户登录 -----");
                        Console.Write("请输入用户名：");
                        string loginUsername = _scanner.ReadLine();

                        Console.Write("请输入密码：");
                        string loginPassword = _scanner.ReadLine();

                        // 调用登录方法
                        Login(loginUsername, loginPassword);
                        break;

                    case 3:
                        // 退出系统
                        Console.WriteLine("\n👋 感谢使用，再见！");
                        return;
                }
            }
        }
    }

    public class ConsoleScanner
    {
        public string ReadLine()
        {
            return Console.ReadLine()?.Trim() ?? string.Empty;
        }
    }

